ํ๋ก ํธ์๋ ์ฑ์์ PWA ์ค์น ํ๋กฌํํธ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํธ๋ฆฌ๊ฑฐํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด์ธ์. ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํ ๊ธฐ์ค, ๋ชจ๋ฒ ์ฌ๋ก, ๊ณ ๊ธ ๊ธฐ์ ์ ํ๊ตฌํฉ๋๋ค.
ํ๋ก ํธ์๋ PWA ์ค์น ๊ธฐ์ค: ์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ ๋ก์ง ๋ง์คํฐํ๊ธฐ
ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA)์ ๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ ฅํ ๋์์ผ๋ก, ๋ธ๋ผ์ฐ์ ๋ด์์ ์ง์ ํ๋ถํ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค. PWA์ ํต์ฌ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ์ค์นํ ์ ์๋ค๋ ์ ์ผ๋ก, ์คํ๋ผ์ธ ์ ๊ทผ, ํธ์ ์๋ฆผ, ๋์ฑ ํตํฉ๋ ๊ฒฝํ๊ณผ ๊ฐ์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ค์น ๊ณผ์ ์ ์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ๋ด์ ๋ํ๋๋ ํ๋กฌํํธ๋ฅผ ํตํด ์์๋ฉ๋๋ค. ์ด ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ธฐ์ค๊ณผ ๋ก์ง์ ์ดํดํ๋ ๊ฒ์ ์ํํ๊ณ ํจ๊ณผ์ ์ธ PWA ๋์ ์ ๋ณด์ฅํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค.
ํต์ฌ PWA ์ค์น ๊ธฐ์ค์ ๋ฌด์์ธ๊ฐ์?
์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ ๋ก์ง์ ๋ํด ์์๋ณด๊ธฐ ์ ์, ์น์ฌ์ดํธ๊ฐ PWA๋ก ๊ฐ์ฃผ๋๊ณ ์ฌ์ฉ์์ ์ค์น๋ฅผ ์ ๋ํ ์๊ฒฉ์ ๊ฐ์ถ๊ธฐ ์ํด ์ถฉ์กฑํด์ผ ํ๋ ๊ธฐ๋ณธ ๊ธฐ์ค์ ์ดํดํ๋ ๊ฒ์ด ํ์์ ์ ๋๋ค. ์ด๋ฌํ ๊ธฐ์ค์ ๋ธ๋ผ์ฐ์ ์ ์ํด ์ํ๋๋ฉฐ, ์ค์น๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ํน์ ์์ค์ ํ์ง๊ณผ ๊ธฐ๋ฅ์ ์ถฉ์กฑํ๋๋ก ๋ณด์ฅํ๋ ์ญํ ์ ํฉ๋๋ค.
1. ๋ณด์ ์ปจํ ์คํธ (HTTPS)
๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๊ณ ๊ธ ๊ธฐ๋ฅ์ด ํ์ํ ๋ชจ๋ ์ต์ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก, PWA๋ HTTPS๋ฅผ ํตํด ์ ๊ณต๋์ด์ผ ํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์ ๊ธฐ๊ธฐ์ ์๋ฒ ๊ฐ์ ๋ชจ๋ ํต์ ์ด ์ํธํ๋๋๋ก ๋ณด์ฅํ์ฌ, ๋์ฒญ ๋ฐ ์ค๊ฐ์ ๊ณต๊ฒฉ์ผ๋ก๋ถํฐ ๋ณดํธํฉ๋๋ค. HTTPS๊ฐ ์์ผ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ํด๋น ์น์ฌ์ดํธ๋ฅผ PWA๋ก ๊ฐ์ฃผํ์ง ์์ผ๋ฉฐ ์ค์น๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.
์คํ ๊ฐ๋ฅํ ํ: ๋๋ฉ์ธ์ ๋ํ SSL/TLS ์ธ์ฆ์๋ฅผ ํ๋ํ๊ณ ๊ตฌ์ฑํ์ธ์. Let's Encrypt์ ๊ฐ์ ์๋น์ค๋ ๋ฌด๋ฃ ์๋ ์ธ์ฆ์ ๊ด๋ฆฌ๋ฅผ ์ ๊ณตํ์ฌ ์น์ฌ์ดํธ ๋ณด์์ ๊ทธ ์ด๋ ๋๋ณด๋ค ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
2. ์น ์ฑ ๋งค๋ํ์คํธ
์น ์ฑ ๋งค๋ํ์คํธ๋ PWA์ ๋ํ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ JSON ํ์ผ์ ๋๋ค. ์ด ๋ฉํ๋ฐ์ดํฐ์๋ ์ฑ์ ์ด๋ฆ, ์งง์ ์ด๋ฆ, ์ค๋ช , ์์ด์ฝ, ์์ URL, ๋์คํ๋ ์ด ๋ชจ๋์ ๊ฐ์ ์ ๋ณด๊ฐ ํฌํจ๋ฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ ์ด ์ ๋ณด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์์ ํ ํ๋ฉด์ด๋ ์ฑ ์คํ๊ธฐ์ ์ฑ์ ์ฌ๋ฐ๋ฅด๊ฒ ํ์ํฉ๋๋ค.
์ฃผ์ ๋งค๋ํ์คํธ ์์ฑ:
- name: ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ฒด ์ด๋ฆ (์: "์์ ๊ธ๋ก๋ฒ ๋ด์ค").
- short_name: ๊ณต๊ฐ์ด ์ ํ๋ ๋ ์ฌ์ฉํ ์งง์ ๋ฒ์ ์ ์ด๋ฆ (์: "๊ธ๋ก๋ฒ ๋ด์ค").
- description: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ๊ฐ๋ตํ ์ค๋ช .
- icons: ์์ด์ฝ ๊ฐ์ฒด์ ๋ฐฐ์ด๋ก, ๊ฐ ๊ฐ์ฒด๋ ์์ด์ฝ์ ์์ค URL๊ณผ ํฌ๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค. ๋ค์ํ ๊ธฐ๊ธฐ์์ ํธํ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ์ฌ๋ฌ ์์ด์ฝ ํฌ๊ธฐ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
- start_url: ์ฌ์ฉ์๊ฐ ํ ํ๋ฉด์์ ์ฑ์ ์คํํ ๋ ๋ก๋๋์ด์ผ ํ๋ URL (์: "/index.html?utm_source=homescreen").
- display: ์ฑ์ด ์ด๋ป๊ฒ ํ์๋์ด์ผ ํ๋์ง๋ฅผ ์ง์ ํฉ๋๋ค. ์ผ๋ฐ์ ์ธ ๊ฐ์ผ๋ก๋
standalone(์์ฒด ์ต์์ ์ฐฝ์์ ์ด๋ฆผ),fullscreen,minimal-ui,browser(ํ์ค ๋ธ๋ผ์ฐ์ ํญ์์ ์ด๋ฆผ)๊ฐ ์์ต๋๋ค. - theme_color: ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ํ ๋ง ์์์ ์ ์ํฉ๋๋ค. ์ด๋ ์ํ ํ์์ค ๋ฐ ๊ธฐํ UI ์์์ ๋ชจ์์ ์ฌ์ฉ์ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- background_color: ์์ ์ค์ ์น ์ฑ ์ ธ์ ๋ฐฐ๊ฒฝ์์ ์ง์ ํฉ๋๋ค.
๋งค๋ํ์คํธ ์์ (manifest.json):
{
"name": "์์ ๊ธ๋ก๋ฒ ๋ด์ค",
"short_name": "๊ธ๋ก๋ฒ ๋ด์ค",
"description": "์ต์ ๊ธ๋ก๋ฒ ๋ด์ค์ ๋ถ์์ผ๋ก ์ ๋ณด๋ฅผ ์ป์ผ์ธ์.",
"icons": [
{
"src": "/icons/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
},
{
"src": "/icons/icon-512x512.png",
"sizes": "512x512",
"type": "image/png"
}
],
"start_url": "/index.html?utm_source=homescreen",
"display": "standalone",
"theme_color": "#007bff",
"background_color": "#ffffff"
}
์คํ ๊ฐ๋ฅํ ํ: ํฌ๊ด์ ์ธ manifest.json ํ์ผ์ ์์ฑํ๊ณ ํ์ด์ง์ <head> ์น์
์ <link rel="manifest" href="/manifest.json"> ํ๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ HTML์ ์ฐ๊ฒฐํ์ธ์.
3. ์๋น์ค ์์ปค
์๋น์ค ์์ปค๋ ๋ฉ์ธ ๋ธ๋ผ์ฐ์ ์ค๋ ๋์ ๋ณ๊ฐ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํ๋๋ JavaScript ํ์ผ์ ๋๋ค. ๋ธ๋ผ์ฐ์ ์ ๋คํธ์ํฌ ์ฌ์ด์ ํ๋ก์ ์ญํ ์ ํ์ฌ ์คํ๋ผ์ธ ์ ๊ทผ, ํธ์ ์๋ฆผ, ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ์ ๊ฐ์ ๊ธฐ๋ฅ์ ํ์ฑํํฉ๋๋ค. ์๋น์ค ์์ปค๋ PWA๊ฐ ์ค์น ๊ฐ๋ฅ์ผ๋ก ๊ฐ์ฃผ๋๊ธฐ ์ํด ํ์์ ์ ๋๋ค.
์ฃผ์ ์๋น์ค ์์ปค ๊ธฐ๋ฅ:
- ์บ์ฑ: ์ ์ ์์ฐ(HTML, CSS, JavaScript, ์ด๋ฏธ์ง)์ ์บ์ฑํ์ฌ ์คํ๋ผ์ธ ์ ๊ทผ์ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
- ๋คํธ์ํฌ ๊ฐ๋ก์ฑ๊ธฐ: ๋คํธ์ํฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํธ์ ์๋ฆผ: ์ฑ์ด ํ๋ฐํ๊ฒ ์คํ๋๊ณ ์์ง ์์ ๋๋ ์ฌ์ฉ์์ ์ฐธ์ฌ๋ฅผ ์ ๋ํ๊ธฐ ์ํด ํธ์ ์๋ฆผ์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ: ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ฐ์ดํฐ๋ฅผ ๋๊ธฐํํฉ๋๋ค.
์๋น์ค ์์ปค ์์ (service-worker.js):
const CACHE_NAME = 'global-news-cache-v1';
const urlsToCache = [
'/',
'/index.html',
'/css/style.css',
'/js/main.js',
'/icons/icon-192x192.png',
'/icons/icon-512x512.png'
];
self.addEventListener('install', event => {
event.waitUntil(
caches.open(CACHE_NAME)
.then(cache => {
console.log('์บ์๋ฅผ ์ด์์ต๋๋ค');
return cache.addAll(urlsToCache);
})
);
});
self.addEventListener('fetch', event => {
event.respondWith(
caches.match(event.request)
.then(response => {
// ์บ์ ํํธ - ์๋ต ๋ฐํ
if (response) {
return response;
}
return fetch(event.request);
})
);
});
์คํ ๊ฐ๋ฅํ ํ: ๋ฉ์ธ JavaScript ํ์ผ์์ navigator.serviceWorker.register('/service-worker.js')๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค ์์ปค๋ฅผ ๋ฑ๋กํ์ธ์. ์๋น์ค ์์ปค๊ฐ ํ์ ์์ฐ์ ์บ์ฑํ๊ณ ๋คํธ์ํฌ ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ก ์ฌ๋ฐ๋ฅด๊ฒ ๊ตฌ์ฑ๋์๋์ง ํ์ธํ์ธ์.
4. ์ฌ์ฉ์ ์ฐธ์ฌ (๋ฐฉ๋ฌธ ๋น๋)
๋ธ๋ผ์ฐ์ ๋ ์ผ๋ฐ์ ์ผ๋ก ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ๊ธฐ ์ ์ ์ฌ์ฉ์๊ฐ ์น ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ํน์ ํ์ ์ด์ ์ํธ ์์ฉํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ฑ์ ์ ์ฉํ๊ฒ ์๊ฐํ๊ณ ์ค์นํ ๊ฐ๋ฅ์ฑ์ด ๋๋ค๋ ๊ฒ์ ํ์ธํ๊ธฐ ์ํจ์ ๋๋ค. ํน์ ๋ฐฉ๋ฌธ ํ์์ ๊ธฐ๊ฐ์ ๋ธ๋ผ์ฐ์ ๋ง๋ค ๋ค๋ฅด์ง๋ง, ์ผ๋ฐ์ ์ธ ์์น์ ๋์ผํฉ๋๋ค.
5. ๊ธฐํ ๊ธฐ์ค (๋ธ๋ผ์ฐ์ ๋ณ๋ก ๋ค๋ฆ)
์์ ์ธ๊ธ๋ ํต์ฌ ๊ธฐ์ค ์ธ์๋, ๋ธ๋ผ์ฐ์ ๋ ์ค์น ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๊ธฐ ์ํด ์ถ๊ฐ์ ์ธ ์๊ตฌ ์ฌํญ์ ๋ถ๊ณผํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๊ตฌ ์ฌํญ์๋ ๋ค์์ด ํฌํจ๋ ์ ์์ต๋๋ค:
- ์ฌ์ดํธ ์ฒด๋ฅ ์๊ฐ: ์ฌ์ฉ์๋ ๋ฐฉ๋ฌธ ์ค์ ์ฌ์ดํธ์์ ์ต์ํ์ ์๊ฐ์ ๋ณด๋ด์ผ ํฉ๋๋ค.
- ํ์ด์ง ์ํธ ์์ฉ: ์ฌ์ฉ์๋ ์ด๋ค ๋ฐฉ์์ผ๋ก๋ ํ์ด์ง์ ์ํธ ์์ฉํด์ผ ํฉ๋๋ค (์: ๋งํฌ ํด๋ฆญ, ์คํฌ๋กค, ์์ ์ ์ถ).
- ๋คํธ์ํฌ ๊ฐ์ฉ์ฑ: ๋ธ๋ผ์ฐ์ ๋ ์ฌ์ฉ์๊ฐ ์จ๋ผ์ธ ์ํ์ผ ๋๋ง ํ๋กฌํํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ ๋ก์ง ์ดํดํ๊ธฐ
์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ ๋ก์ง์ ๋ธ๋ผ์ฐ์ ๊ฐ ์ฌ์ฉ์์๊ฒ ์ค์น ํ๋กฌํํธ๋ฅผ ์ธ์ ํ์ํ ์ง ๊ฒฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ท์น๊ณผ ์กฐ๊ฑด์ ์งํฉ์ ๋๋ค. ์ด ๋ก์ง์ ์ง๋ฅ์ ์ด๊ณ ์ฌ์ฉ์ ์นํ์ ์ผ๋ก ์ค๊ณ๋์ด, ํ๋กฌํํธ๊ฐ ๊ด๋ จ์ฑ ์๊ณ ํ์๋ฐ์ ๊ฐ๋ฅ์ฑ์ด ๋์ ๋๋ง ํ์๋๋๋ก ๋ณด์ฅํฉ๋๋ค.
beforeinstallprompt ์ด๋ฒคํธ
์ค์น ํ๋กฌํํธ๋ฅผ ์ ์ดํ๋ ํต์ฌ์ beforeinstallprompt ์ด๋ฒคํธ์
๋๋ค. ์ด ์ด๋ฒคํธ๋ PWA๊ฐ ์ค์น ๊ธฐ์ค์ ์ถฉ์กฑํ ๋ ๋ธ๋ผ์ฐ์ ์ ์ํด ๋ฐ์ํฉ๋๋ค. ์ค์ํ๊ฒ๋, ์ด ์ด๋ฒคํธ๋ ์ทจ์ ๊ฐ๋ฅํ๋ฏ๋ก ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ง๊ณ ๋์ ์์ ๋ง์ ๋ง์ถคํ ํ๋กฌํํธ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค.
beforeinstallprompt ์ด๋ฒคํธ ์์ ํ๊ธฐ:
let deferredPrompt;
window.addEventListener('beforeinstallprompt', (event) => {
// ๋ชจ๋ฐ์ผ์์ ๋ฏธ๋ ์ ๋ณด ํ์์ค์ด ๋ํ๋๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค
event.preventDefault();
// ๋์ค์ ํธ๋ฆฌ๊ฑฐํ ์ ์๋๋ก ์ด๋ฒคํธ๋ฅผ ์ ์ฅํฉ๋๋ค.
deferredPrompt = event;
// UI๋ฅผ ์
๋ฐ์ดํธํ์ฌ ์ฌ์ฉ์๊ฐ PWA๋ฅผ ์ค์นํ ์ ์์์ ์๋ฆฝ๋๋ค
showInstallPromotion();
});
์ค๋ช :
beforeinstallprompt์ด๋ฒคํธ๋ฅผ ์ ์ฅํ๊ธฐ ์ํดdeferredPrompt๋ณ์๋ฅผ ์ ์ธํฉ๋๋ค.beforeinstallprompt์ด๋ฒคํธ๋ฅผ ์์ ํ๊ธฐ ์ํดwindow๊ฐ์ฒด์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.- ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ด๋ถ์์
event.preventDefault()๋ฅผ ํธ์ถํ์ฌ ๋ธ๋ผ์ฐ์ ๊ฐ ๊ธฐ๋ณธ ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ๋ ๊ฒ์ ๋ฐฉ์งํฉ๋๋ค. - ๋์ค์ ์ฌ์ฉํ๊ธฐ ์ํด
event๊ฐ์ฒด๋ฅผdeferredPrompt๋ณ์์ ์ ์ฅํฉ๋๋ค. - ์ฌ์ฉ์์๊ฒ ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ๊ธฐ ์ํด
showInstallPromotion()ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
๋ง์ถค ์ค์น ํ๋กฌํํธ ๊ตฌํํ๊ธฐ
beforeinstallprompt ์ด๋ฒคํธ๋ฅผ ์บก์ฒํ๋ค๋ฉด, ์์ ๋ง์ ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ๊ตฌํํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ํ๋กฌํํธ์ ๋ชจ์๊ณผ ๋์์ ์ ์ดํ์ฌ ๋ ๋ง์ถคํ๋๊ณ ์ฌ์ฉ์ ์นํ์ ์ธ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋ง์ถค ์ค์น ํ๋กฌํํธ ์์:
function showInstallPromotion() {
const installButton = document.getElementById('install-button');
installButton.style.display = 'block';
installButton.addEventListener('click', async () => {
// ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค
deferredPrompt.prompt();
// ์ฌ์ฉ์๊ฐ ํ๋กฌํํธ์ ์๋ตํ ๋๊น์ง ๊ธฐ๋ค๋ฆฝ๋๋ค
const { outcome } = await deferredPrompt.userChoice;
// ์ ํ์ ์ผ๋ก ์ฌ์ฉ์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ถ์ ์ด๋ฒคํธ๋ก ๋ณด๋
๋๋ค
console.log(`์ค์น ํ๋กฌํํธ์ ๋ํ ์ฌ์ฉ์ ์๋ต: ${outcome}`);
// ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ผ๋ฏ๋ก ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ฒ๋ฆฝ๋๋ค
deferredPrompt = null;
installButton.style.display = 'none';
});
}
์ค๋ช :
showInstallPromotion()ํจ์๋ ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ๋ ์ญํ ์ ํฉ๋๋ค.- ๋จผ์ ์ค์น ๋ฒํผ์
display์คํ์ผ์'block'์ผ๋ก ์ค์ ํ์ฌ ๋ณด์ด๊ฒ ํฉ๋๋ค. - ๊ทธ๋ฐ ๋ค์ ํด๋ฆญ ์ด๋ฒคํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค์น ๋ฒํผ์ ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
- ํด๋ฆญ ์ด๋ฒคํธ ๋ฆฌ์ค๋ ๋ด๋ถ์์
deferredPrompt.prompt()๋ฅผ ํธ์ถํ์ฌ ์ฌ์ฉ์์๊ฒ ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค. - ๊ทธ๋ฐ ๋ค์
await deferredPrompt.userChoice๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ํ๋กฌํํธ์ ์๋ตํ๊ธฐ๋ฅผ ๊ธฐ๋ค๋ฆฝ๋๋ค. ์ด๊ฒ์ ์ฌ์ฉ์์ ์ ํ ๊ฒฐ๊ณผ('accepted'๋๋'dismissed')๋ฅผ ํฌํจํ๋ ๊ฐ์ฒด๋ก ํด๊ฒฐ๋๋ ํ๋ก๋ฏธ์ค๋ฅผ ๋ฐํํฉ๋๋ค. - ๋ถ์ ๋ชฉ์ ์ผ๋ก ์ฌ์ฉ์์ ์๋ต์ ์ฝ์์ ๊ธฐ๋กํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, ํ๋กฌํํธ๋ ํ ๋ฒ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก
deferredPrompt๋ฅผnull๋ก ์ค์ ํ๊ณ ์ค์น ๋ฒํผ์ ์จ๊น๋๋ค.
์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๊ธ์ ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ๋ ค๋ฉด ์ค์น ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ ๋ ๋ค์๊ณผ ๊ฐ์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค:
- ๊ณต๊ฒฉ์ ์ผ๋ก ํ๋ํ์ง ๋ง์ธ์: ์ฌ์ฉ์์ ์ฒซ ๋ฐฉ๋ฌธ ์ ์ฆ์ ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํ์ง ๋ง์ธ์. ์ด๋ ๋ฐฉํด๋ก ์ธ์๋ ์ ์์ผ๋ฉฐ ์ฌ์ฉ์๊ฐ ์ฑ์ ์ฌ์ฉํ์ง ์๊ฒ ๋ง๋ค ์ ์์ต๋๋ค.
- ๋งฅ๋ฝ์ ์ ๊ณตํ์ธ์: PWA ์ค์น์ ์ด์ ์ ์ค๋ช ํ์ธ์. ์คํ๋ผ์ธ ์ ๊ทผ, ๋ ๋น ๋ฅธ ๋ก๋ฉ ์๊ฐ, ๋ ๋ชฐ์ ๊ฐ ์๋ ๊ฒฝํ๊ณผ ๊ฐ์ ๊ธฐ๋ฅ์ ๊ฐ์กฐํ์ธ์.
- ๋ง์ถค ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ์ธ์: ์ฑ์ ๋์์ธ๊ณผ ๋๋์ ๋ง๋ ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ๊ตฌํํ์ธ์. ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๊ฐ์ ํ๊ณ ์ค์น ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฌ์ฉ์ ํ๋์ ๊ณ ๋ คํ์ธ์: ์ฌ์ฉ์ ํ๋์ ๊ธฐ๋ฐํ์ฌ ์ค์น ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ์ธ์. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ์ฌ๋ฌ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ๊ฑฐ๋ ์ฌ์ดํธ์์ ์ผ์ ์๊ฐ์ ๋ณด๋ธ ํ์ ํ๋กฌํํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ์ฒ ์ ํ ํ ์คํธํ์ธ์: ์ค์น ํ๋กฌํํธ ๋ก์ง์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๊ณ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋ ๊ฒฝํ์ ์ ๊ณตํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์ ๊ธฐ๊ธฐ์์ ํ ์คํธํ์ธ์.
- ํ๋กฌํํธ๋ฅผ ์ง์ฐ์ํค์ธ์: `beforeinstallprompt`๋ฅผ ์ง์ฐ์ํค๊ณ ๋ฒํผ์ด๋ ์ ์ฌํ ๊ฒ์ด ํด๋ฆญ๋ ํ์๋ง ํ์ํ์ธ์.
์ฃ์ง ์ผ์ด์ค ๋ฐ ๋ธ๋ผ์ฐ์ ์ฐจ์ด์ ์ฒ๋ฆฌํ๊ธฐ
์ค์น ํ๋กฌํํธ์ ๋์์ ๋ธ๋ผ์ฐ์ ๋ง๋ค ์ฝ๊ฐ์ฉ ๋ค๋ฅผ ์ ์๋ค๋ ์ ์ ์ธ์งํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ๋ธ๋ผ์ฐ์ ๋ ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ์ง์ํ์ง ์์ ์ ์์ผ๋ฉฐ, ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ๋ ํ๋กฌํํธ๋ฅผ ํธ๋ฆฌ๊ฑฐํ๋ ๊ธฐ์ค์ด ๋ค๋ฅผ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ฐจ์ด์ ์ ์ฒ๋ฆฌํ๋ ค๋ฉด ๋ค์์ ์ํํด์ผ ํฉ๋๋ค:
- ์ง์ ์ฌ๋ถ ํ์ธ:
beforeinstallprompt์ด๋ฒคํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ ์ ๋ธ๋ผ์ฐ์ ์์ ์ง์๋๋์ง ํ์ธํ์ธ์. - ๋์ฒด ๋ฐฉ์ ์ ๊ณต: ๋ง์ถค ์ค์น ํ๋กฌํํธ๊ฐ ์ง์๋์ง ์๋ ๊ฒฝ์ฐ, ์ฑ ์คํ ์ด์ ์ฑ ํ์ด์ง ๋งํฌ(ํด๋นํ๋ ๊ฒฝ์ฐ)์ ๊ฐ์ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ธ์.
- ์ฌ๋ฌ ๋ธ๋ผ์ฐ์ ์์ ํ ์คํธ: ๋ชจ๋ ํ๊ฒฝ์์ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋์ง ํ์ธํ๊ธฐ ์ํด ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ ์ค์น ํ๋กฌํํธ ๋ก์ง์ ํ ์คํธํ์ธ์.
- ํ๋ซํผ ์ ํ ์ฌํญ์ ์ ์ํ์ธ์: ์ผ๋ถ ํ๋ซํผ์์๋ PWA ์ค์น๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค (์: 16.4 ๋ฒ์ ์ด์ ์ iOS).
์ค์น ํ๋กฌํํธ ์ต์ ํ๋ฅผ ์ํ ๊ณ ๊ธ ๊ธฐ์
์ค์น ํ๋กฌํํธ์ ๊ธฐ๋ณธ ๊ตฌํ์ ๋์ด, ์ค์น ๊ณผ์ ์ ์ต์ ํํ๊ณ ์ฌ์ฉ์ ์ฐธ์ฌ๋ฅผ ๊ฐ์ ํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ์ ์ด ์์ต๋๋ค.
1. A/B ํ ์คํธ
A/B ํ ์คํธ๋ ์ค์น ํ๋กฌํํธ์ ๋ ๊ฐ์ง ์ด์์ ๋ฒ์ ์ ๋ง๋ค์ด ๋ค๋ฅธ ์ฌ์ฉ์ ๊ทธ๋ฃน๊ณผ ํ ์คํธํ๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ์ฅ ํจ๊ณผ์ ์ธ ํ๋กฌํํธ ๋์์ธ๊ณผ ๋ฉ์์ง๋ฅผ ์๋ณํ์ฌ ๋ ๋์ ์ค์น์จ์ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
A/B ํ ์คํธ ์์:
- ๋ฒ์ A: ๊ธฐ๋ณธ์ ์ธ ํ๋ ์ ๋ ๋ฌธ๊ตฌ๊ฐ ์๋ ๊ฐ๋จํ ์ค์น ํ๋กฌํํธ (์: "์ฑ ์ค์น").
- ๋ฒ์ B: ์ฑ ์ค์น์ ์ด์ ์ ๊ฐ์กฐํ๋ ๋ ์์ธํ ์ค์น ํ๋กฌํํธ (์: "์คํ๋ผ์ธ ์ ๊ทผ ๋ฐ ๋ ๋น ๋ฅธ ๋ก๋ฉ์ ์ํด ์ฑ ์ค์น").
๊ฐ ๋ฒ์ ์ ์ค์น์จ์ ์ถ์ ํจ์ผ๋ก์จ ์ด๋ค ํ๋กฌํํธ๊ฐ ๋ ํจ๊ณผ์ ์ธ์ง ๊ฒฐ์ ํ๊ณ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ํด๋น ํ๋กฌํํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
2. ์ํฉ๋ณ ํ๋กฌํํธ
์ํฉ๋ณ ํ๋กฌํํธ๋ ์ฌ์ฉ์์ ํ์ฌ ์ํฉ์ ๋ง๊ฒ ์กฐ์ ๋ ์ค์น ํ๋กฌํํธ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์์ ํ์ํ๋ ์ฌ์ฉ์์ ๋ฐ์คํฌํฑ ์ปดํจํฐ์์ ํ์ํ๋ ์ฌ์ฉ์์๊ฒ ๋ค๋ฅธ ํ๋กฌํํธ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
์ํฉ๋ณ ํ๋กฌํํธ ์์:
- ๋ชจ๋ฐ์ผ ์ฌ์ฉ์: ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ์ ์ฑ์ ์ค์นํ๋ ๊ฒ์ ์ด์ ์ ๊ฐ์กฐํ๋ ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค (์: "์คํ๋ผ์ธ ์ ๊ทผ ๋ฐ ํธ์ ์๋ฆผ์ ์ํด ์ฑ ์ค์น").
- ๋ฐ์คํฌํฑ ์ฌ์ฉ์: ์ฑ์ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ค์นํ๋ ๊ฒ์ ์ด์ ์ ๊ฐ์กฐํ๋ ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค (์: "์ ์ฉ ์ฐฝ ๋ฐ ํฅ์๋ ์ฑ๋ฅ์ ์ํด ์ฑ ์ค์น").
3. ์ง์ฐ๋ ํ๋กฌํํธ
์ง์ฐ๋ ํ๋กฌํํธ๋ ์ผ์ ์๊ฐ์ด ์ง๋๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ํน์ ์์ ์ ์ํํ ํ์ ํ์๋๋ ์ค์น ํ๋กฌํํธ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์์ ์ด๊ธฐ ๊ฒฝํ์ ๋ฐฉํดํ์ง ์๊ณ ํ๋กฌํํธ์ ์์ฉ์ ์ผ ๊ฐ๋ฅ์ฑ์ ๋์ด๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ง์ฐ๋ ํ๋กฌํํธ ์์:
- ์ฌ์ฉ์๊ฐ ์ฌ์ดํธ์์ 5๋ถ์ ๋ณด๋ด๊ฑฐ๋ 3๊ฐ์ ๋ค๋ฅธ ํ์ด์ง๋ฅผ ๋ฐฉ๋ฌธํ ํ์ ์ค์น ํ๋กฌํํธ๋ฅผ ํ์ํฉ๋๋ค.
๊ฒฐ๋ก
PWA ์ค์น ํ๋กฌํํธ ํธ๋ฆฌ๊ฑฐ ๋ก์ง์ ๋ง์คํฐํ๋ ๊ฒ์ ์ํํ๊ณ ๋งค๋ ฅ์ ์ธ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ฃผ์ ์ค์น ๊ธฐ์ค์ ์ดํดํ๊ณ , ๋ง์ถค ์ค์น ํ๋กฌํํธ๋ฅผ ๊ตฌํํ๋ฉฐ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด PWA์ ๋์ ์ ํฌ๊ฒ ๋๋ฆฌ๊ณ ์ฌ์ฉ์์๊ฒ ๋ค์ดํฐ๋ธ ๋ชจ๋ฐ์ผ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ์น ์๋ ๋์์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ์ฉ์ ๊ฒฝํ์ ์ฐ์ ์ํ๊ณ ์ค์น ํ๋กฌํํธ๋ฅผ ์ง๋์น๊ฒ ๊ณต๊ฒฉ์ ์ผ๋ก ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ๊ธฐ์ตํ์ธ์. ๋งฅ๋ฝ์ ์ ๊ณตํ๊ณ PWA ์ค์น์ ์ด์ ์ ๊ฐ์กฐํจ์ผ๋ก์จ, ์ฌ์ฉ์๋ค์ด ์ฑ์ด ์ ๊ณตํ๋ ๋ชจ๋ ๊ธฐ๋ฅ๊ณผ ์ฑ๋ฅ์ ์ฆ๊ธธ ์ ์๋๋ก ์ ๋ํ ์ ์์ต๋๋ค. ์น์ด ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ, PWA๋ ๋ชจ๋ฐ์ผ ํ๊ฒฝ์์ ์ ์ ๋ ์ค์ํ ์ญํ ์ ํ ๊ฒ์ด๋ฉฐ, ์ ์คํ๋ ์ค์น ๊ฒฝํ์ ์ฑ๊ณต์ ํ์์ ์ ๋๋ค.
ํต์ฌ ๊ธฐ์ค, beforeinstallprompt ์ด๋ฒคํธ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ฒ ์ฌ๋ก์ ์ง์คํจ์ผ๋ก์จ ์ ์ธ๊ณ ๊ฐ๋ฐ์๋ค์ ๋ค์ํ ํ๋ซํผ๊ณผ ๊ธฐ๊ธฐ์์ ์ฌ์ฉ์์๊ฒ ์ฆ๊ฑฐ์ด ๊ฒฝํ์ ์ ๊ณตํ๋ ์ฝ๊ฒ ์ค์น ๊ฐ๋ฅํ PWA๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ๊ณ์ํด์ ๋ค์ํ ์ ๊ทผ ๋ฐฉ์์ ์คํํ๊ณ PWA์ ํ์ ํ์ฉํ์ฌ ๋ฐ์ด๋ ์น ๊ฒฝํ์ ์ ๊ณตํ์ธ์.